import requests
import urllib.parse
import urllib.request
# 发送请求
# response = requests.get(url="http://www.baidu.com/s", params={'wd':'python'})
# # 处理响应
# print(response.status_code)
# TODO  urllib 实现
# url = "http://www.baidu.com/s"
# params = urllib.parse.urlencode({'wd':'python'})
# # 发送请求
# response = urllib.request.urlopen('?'.join([url, params]))
# # 处理响应
# print(response.getcode())

# TODO 发送请求
# r = requests.get('https://api.github.com/events')
# r = requests.post('http://httpbin.org/post', data = {'key':'value'})
# print(r.status_code)
'''
r = requests.put('http://httpbin.org/put', data = {'key':'value'})
r = requests.delete('http://httpbin.org/delete')
r = requests.head('http://httpbin.org/get')
r = requests.options('http://httpbin.org/get')
'''
# TODO 传递参数
# 字典
# payload = {'key1': 'value1', 'key2': 'value2'}
# r = requests.get("http://httpbin.org/get", params=payload)
# print(r.url)
# 列表
# payload = {'key1': 'value1', 'key2': ['value2', 'value3']}
# r = requests.get("http://httpbin.org/get", params=payload)
# print(r.url)
# TODO 响应内容
r = requests.get('http://www.baidu.com')
# 返回（太多，只显示一部分）
# print(r.text)
# 编码 如果你改变了编码，每当你访问 r.text ，Request 都将会使用 r.encoding 的新值
# print(r.encoding)
# TODO二进制响应内容
from PIL import Image
from io import BytesIO
# r  = requests.get('http://img.sccnn.com/bimg/326/203.jpg')
# print(r.content)
# bi = BytesIO(r.content)
# print(bi)
# i = Image.open(bi)
# print(i)
# TODO JSON 响应内容
# r = requests.get('https://api.github.com/events')
# # r.status_code 返回成功
# print(r.status_code)
# print(r.json())

# TODO  原始响应内容
# 在极少数情况下，你可能想获取来自服务器的原始套接字响应，那么你可以访问 r.raw。 这个时候请确保在初始请求中设置了 stream=True。
# r = requests.get('https://www.baidu.com/', stream=True)
# print(r.raw)
# print(r.raw.read(10))

#  TODO  设置请求头
# url = 'http://www.baidu.com'
# headers = {'User-Agent': 'myagent/2.21.0'}
# r = requests.get(url, headers=headers)
# print(r.request.headers)

# TODO 复杂的 POST 请求
'''
{
    "args": {},
    "data": "",
    "files": {},
    "form": {},
    "headers": {},
    "json": null,
    "origin": "221.232.172.222, 221.232.172.222",
    "url": "https://httpbin.org/post"
}
这些关键字都可以在 POST 的参数里面设置。其中 headers 和 args 我们前面已经讲过，
分别表示请求头和参数信息。origin 是指请求的路由 ip，url 是我们请求的 url，其他几个我们都是可以设置的。下面我们就来看看其他几个关键字怎么设置
'''
# TODO 设置data参数
# payload = {'key1': 'value1', 'key2': 'value2'}
# r = requests.post("http://httpbin.org/post", data=payload)
# print(r.text)
# 你也可以为 data 参数传入一个元组列表。Requests 会自动将其转换成一个列表：
# payload = (('key1', 'value1'), ('key1', 'value2'))
# r = requests.post("http://httpbin.org/post", data=payload)
# print(r.text)
# TODO 设置 json 参数 不仅赋值给 json 了，而且还自动赋值给 data 了，json 里面的键值对也被自动编码到 data 中
# payload = {'some': 'data'}
# r = requests.post("http://httpbin.org/post", json=payload)
# print(r.text)

# TODO  设置文件参数
# files = {'file': open('test.txt', 'rb')}
# r = requests.post('http://httpbin.org/post', files=files)
# print(r.text)
# files = {'file': ('test.txt', 'some,data,to,send\nanother,row,to,send\n')}
# r = requests.post('http://httpbin.org/post', files=files)
# print(r.text)
# TODO  响应状态码和响应头
# r = requests.get('http://httpbin.org/get')
# print(r.status_code)
# print(r.status_code == requests.codes.ok)
# 响应头
# print(r.headers)
# # 要获取响应头的某个字段值
# print(r.headers['Date'])

# TODO  Cookie
# url = 'http://example.com/some/cookie/setting/url'
# r = requests.get(url)
# cookies = dict(cookies_are='working')
# r = requests.get('http://httpbin.org/cookies', cookies=cookies)
# print(r.text)
# Cookie 的返回对象为 RequestsCookieJar，它和字典类似，适合跨域名跨路径使用，也就是说我们可以为不同的域名或者路径设置不同的 cookie 。你还可以把 Cookie Jar 传到 Requests 中：
# jar = requests.cookies.RequestsCookieJar()
# #为路径/cookies设置cookie
# jar.set('tasty_cookie', 'yum', domain='httpbin.org', path='/cookies')
# #为路径/elsewhere设置cookie
# jar.set('gross_cookie', 'blech', domain='httpbin.org', path='/elsewhere')
# #请求路径为/cookies的URL
# url = 'http://httpbin.org/cookies'
# r = requests.get(url, cookies=jar)
# print(r.text)

# TODO  重定向与请求历史
# r = requests.get('http://github.com')
# print(r.url)
# print(r.status_code)
# print(r.history)
'''
如果你使用的 Mac ，在运行这段代码时报错： ConnectionResetError: [Errno 54] Connection reset by peer。
你需要升级你系统的 openssl，具体方法请自行百度关键词“mac 更新OpenSSL”，更新之后就不会报错了
'''
# 我们还可以通过 allow_redirects 参数禁用重定向处理
# r = requests.get('http://github.com', allow_redirects=False)
# print(r.status_code)
# print(r.history)
# TODO  超时
requests.get('http://github.com', timeout=0.001)
'''
注意 timeout 仅对连接过程有效，与响应体的下载无关。 timeout 并不是整个下载响应的时间限制，而是如果服务器在 timeout 秒内没有应答，将会引发一个异常
'''

